home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / WORDMISC / WPUTIL.LZH / WP5XASCE.ARC / WP5XASCE.8 next >
Text File  |  1988-07-06  |  11KB  |  250 lines

  1. ; HELP.COM by Bob Montgomery, 2/23/87
  2. ; This program is a generic help screen template for use with the A86
  3. ; assembler. The desired help message is written as db's at Hlpst in
  4. ; place of the test message that is there now. The only restrictions 
  5. ; on the help message are:
  6. ;    1. The message must not exceed 80 characters wide.
  7. ;    2. The message must not exceed 25 lines long.
  8. ;    3. Each help line must be the same length.
  9. ; The program will auto center the message on the display screen. The hot 
  10. ; key combo to bring up the help screen is defined as Hotkey below (set 
  11. ; for Cntl-Leftshift right now) and can be changed to another combination
  12. ; by changing the equate for Hotkey.
  13.  
  14.      jmp  Init           ;Initialize program
  15.  
  16. Esc  equ  1Bh
  17. Vidmem equ 0B800         ;Location of screen 0
  18. Monomem equ 0B000        ;Location of mono screen
  19. BWattr equ 70h           ;Grey background, black foreground
  20.  
  21. ; Bits in shift status
  22. Rtsh   equ 1
  23. Lftsh  equ 2
  24. Cntl   equ 4
  25. Alt    equ 8
  26. Scrl   equ 10h
  27. Numl   equ 20h
  28. Capl   equ 40h
  29.  
  30. Mode   db  ?             ;Current video mode
  31. Vpage  db  ?             ;Current video page
  32. Vidseg dw  ?             ;Current page segment
  33. Hlpflg db  0             ;1 => Help on
  34. Attr   db  ?             ;Attribute to use
  35. Cursor dw  ?             ;Current cursor type
  36.  
  37. ; =================================================================
  38. ; This is the VEdit Plus help message to be displayed in blue on white
  39. ; when Cntl-Left Shift pressed. 74 char X 25 lines screen size.
  40.  
  41. Colattr equ 71h          ;White background, blue foreground
  42. Hotkey equ Cntl+Lftsh    ;Cntl-Left Shift key combo brings up screen
  43.  
  44. Hlpst: db '███████████WordPerfect 5.0 extended ASCII character printer map key█████████████'
  45. Linchr equ $-Hlpst       ;Chars on each help line
  46.      db   '███╔═Asc═══Map═╤═Asc════Map═╤═Asc═══Map═╤═Asc═══Map═╤═Asc═══Map═╤═Asc═══Map═╗███'
  47.      db   '███║128 Ç 1,38 │150 û  1,69 │172 ¼ 4,18 │194 ┬ 3,15 │216 ╪ 3,47 │238 ε 8,11 ║███'
  48.      db   '███║129 ü 1,71 │151 ù  1,73 │173 ¡ 4,7  │195 ├ 3,14 │217 ┘ 3,12 │239 ∩ 6,17 ║███'
  49.      db   '███║130 é 1,41 │152 ÿ  1,75 │174 « 4,9  │196 ─ 3,8  │218 ┌ 3,10 │240 ≡ 6,15 ║███'
  50.      db   '███║131 â 1,29 │153 Ö  1,62 │175 » 4,10 │197 ┼ 3,18 │219 █ 3,3  │241 ± 6,1  ║███'
  51.      db   '███║132 ä 1,31 │154 Ü  1,71 │176 ░ 3,0  │198 ╞ 3,38 │220 ▄ 3,7  │242 ≥ 6,3  ║███'
  52.      db   '███║133 à 1,33 │155 ¢  4,19 │177 ▒ 3,1  │199 ╟ 3,42 │221 ▌ 3,4  │243 ≤ 6,2  ║███'
  53.      db   '███║134 å 1,35 │156 £  4,11 │178 ▓ 3,2  │200 ╚ 3,24 │222 ▐ 3,6  │244 ⌠ 7,0  ║███'
  54.      db   '███║135 ç 1,39 │157 ¥  4,12 │179 │ 3,9  │201 ╔ 3,21 │223 ▀ 3,7  │245 ⌡ 7,1  ║███'
  55.      db   '███║136 ê 1,43 │158 ₧  4,13 │180 ┤ 3,16 │202 ╩ 3,28 │224 α 8,1  │246 ÷ 6,8  ║███'
  56.      db   '███║137 ë 1,45 │159 ƒ  4,14 │181 ╡ 3,41 │203 ╦ 3,26 │225 ß 8,3  │247 ≈ 6,13 ║███'
  57.      db   '███║138 è 1,47 │160 á  1,27 │182 ╢ 3,27 │204 ╠ 3,25 │226 Γ 8,6  │248 ° 4,1  ║███'
  58.      db   '███║139 ï 1,53 │161 í  1,49 │183 ╖ 3,35 │205 ═ 3,54 │227 π 8,33 │249 ∙ 4,0  ║███'
  59.      db   '███║140 î 1,51 │162 ó  1,59 │184 ╕ 3,31 │206 ╬ 3,29 │228 Σ 8,37 │250 · 4,3  ║███'
  60.      db   '███║141 ì 1,55 │163 ú  1,67 │185 ╣ 3,27 │207 ╧ 3,45 │229 σ 8,37 │251 √ 7,4  ║███'
  61.      db   '███║142 Ä 1,30 │164 ñ  1,57 │186 ║ 3,20 │208 ╨ 3,41 │230 µ 8,25 │252 ⁿ 4,21 ║███'
  62.      db   '███║143 Å 1,34 │165 Ñ  1,56 │187 ╗ 3,22 │209 ╤ 3,43 │231 τ 8,41 │253 ² 4,20 ║███'
  63.      db   '███║144 É 1,41 │166 ª  4,15 │188 ╝ 3,23 │210 ╥ 3,39 │232 Φ 8,44 │254 ■ 4,2  ║███'
  64.      db   '███║145 æ 1,37 │167 º  4,16 │189 ╜ 3,36 │211 ╙ 3,37 │233 Θ 8,16 │255 NotMapd║███'
  65.      db   '███║146 Æ 1,36 │168 ¿  4,8  │190 ╛ 3,32 │212 ╘ 3,33 │234 Ω 8,51 ├───────────╢███'
  66.      db   '███║147 ô 1,61 │169 ⌐  5,16 │191 ┐ 3,11 │213 ╒ 3,30 │235 δ 8,11 │  Syntax:  ║███'
  67.      db   '███║148 ö 1,63 │170 ¬  5,17 │192 └ 3,13 │214 ╓ 3,34 │236 ∞ 6,19 │Ctrl V n,nn║███'
  68.      db   '███║149 ò 1,65 │171 ½  4,17 │193 ┴ 3,17 │215 ╫ 3,46 │237 φ 8,45 │n,nn = Map ║███'
  69.      db   '███╚═══════════╧════════════╧═══════════╧═══════════╧═══════════╧═══════════╝███'
  70. ; ====================================================================
  71.  
  72. Msglen equ $-Hlpst       ;# chars in help buffer
  73. Lines equ Msglen/Linchr  ;# lines of help
  74. Buflen equ 2*Msglen      ;Screen data buffer length
  75. Stlin equ (25-Lines)/2   ;Start line
  76. Stchr equ (80-Linchr)/2  ;Start byte on line
  77. Stscr equ 160*Stlin + 2*Stchr ;Start of mem to put help
  78.  
  79. Scrbuf: db Buflen dup (?) ;Buffer for screen data
  80.  
  81. ; New Int 9 routine - check for Cntrl-LShift; ignore others.
  82. ; Since Int 9 is called every time a key is pressed or released, and
  83. ; reads the keyboard thru some mysterious means in BIOS, we must call
  84. ; the old Int 9 as a subroutine each time an Int 9 is generated. But,
  85. ; an interrupt routine has a IRET instead of a RET as the return
  86. ; instruction, which pops the return address like a RET does, and then
  87. ; pops the flags. So to call Int 9 like a subroutine, we have to push
  88. ; the flags first; then when the the IRET is executed, control returns
  89. ; to our program with the stack pointer at the right place.
  90.  
  91. Start: push ax,bx,cx,dx,ds,es,di,si ;Save all for calling program
  92.      pushf               ;Put flags on stack since Int pops flags
  93. Oldint: call 0000:0000   ;Call old Int 9 to get key-will pop flags
  94.      mov  ah,2           ;Get shift status
  95.      Int  16h            ;in al
  96.      and  al,Hotkey      ;Only keep Hot keys
  97.      cmp  al,Hotkey      ;Were both pressed?
  98.      jne  Exit           ;No
  99.      mov  ds,cs          ;Yes, set ds=cs
  100.      cmp  Hlpflg,1       ;Is help already up?
  101.      jne  Go             ;No, put it up
  102. ; If help is already up, ignore the Hotkey.
  103. Exit: pop si,di,es,ds,dx,cx,bx,ax ;Restore all for calling program
  104.      iret                ;Pop return address and flags
  105.  
  106. ; Come here if should put up help.
  107. Go:  mov  al,Colattr     ;Assume color
  108.      mov  Attr,al
  109.      mov  ah,15          ;Get video mode in al
  110.      int  10h            ;and page in bh
  111.      mov  Mode,al        ;Save Mode
  112.      mov  Vpage,bh       ;and page
  113.      cmp  al,2           ;Mode=2?
  114.      je   Color          ;Yes
  115.      cmp  al,3           ;Mode=3?
  116.      je   Color          ;Yes
  117.      cmp  al,7           ;Mode=7? (mono)
  118.      jne  Exit           ;No, must be graphics so exit
  119.      mov  al,BWattr      ;Set B&W attribute
  120.      mov  Attr,al
  121.      mov  bx,Monomem     ;and start of mono video memory
  122.      jmp  short A0
  123. Color: mov  bl,0         ;Bx=256*display page
  124.      add  bx,Vidmem      ;Get display mem segment
  125. A0:  mov  ds,bx          ;in ds
  126.  
  127. ; Put up help screen.
  128. ; First save current screen to buffer.
  129.      call Hidecur        ;Hide cursor
  130.      call Vidoff         ;Disable video (avoids snow on CGA)
  131.      mov  dl,Lines       ;Get # lines of help
  132.      mov  es,cs          ;es=cs
  133.      mov  si,Stscr       ;ds:si points to help screen area in disp mem
  134.      mov  di,Scrbuf      ;es:di points to buffer for screen data
  135.      push si,es,ds       ;Save them
  136.      mov  ch,0           ;ch=0
  137.      mov  cl,Linchr      ;cx=chars/help line
  138. A1:  push si,cx          ;Save position in scrn mem & chars/line
  139.      cld                 ;Set to inc si & di
  140.      rep  movsw          ;Move screen to buffer
  141.      pop  cx,si          ;Get start of line & chars/line
  142.      add  si,160         ;Next line, same column
  143.      dec  dl             ;Done all lines?
  144.      jne  A1             ;No
  145.  
  146. ; Now put up help.
  147.      pop  es,ds,di       ;Now ds=cs, es:di=help scrn area in screen mem
  148.      push di,ds,es       ;Put back in orig order
  149.      mov  si,Hlpst       ;Point si to help data
  150.      mov  dl,Lines       ;Get chars/help line
  151.      mov  ah,Attr        ;Get char attribute (color)
  152. B1:  push di,cx          ;Save disp mem pos & chars/help line
  153. B2:  lodsb               ;Get a help char in al
  154.      stosw               ;Save char & attribute in screen mem
  155.      loop B2             ;Do whole line
  156.      pop  cx,di          ;Get start of disp line & chars/line
  157.      add  di,160         ;Next line, same column
  158.      dec  dl             ;Done all lines?
  159.      jne  B1             ;No
  160.      mov  Hlpflg,1       ;Yes, indicate help up
  161.      call Vidon          ;and enable video
  162.  
  163. ; Now, wait for the escape key; come here after each keypress (Int 9).
  164. Wait1: mov ah,0          ;Wait for a key
  165.      int  16h
  166.      cmp  al,Esc         ;Was it Escape?
  167.      jne  Wait1          ;No
  168.  
  169. ; If Esc was pressed, put the old screen back
  170.      pop  es,ds,di       ;ds=cs; es:di=start of help area in disp mem
  171.      mov  si,Scrbuf      ;Point to old screen data buffer
  172.      call Vidoff         ;Disable video (avoid snow on CGA)
  173.      mov  dl,Lines       ;Chars/help line
  174. C1:  push di,cx          ;Save scrn mem pointer & chars/line
  175.      rep  movsw          ;Move a line to scrn mem
  176.      pop  cx,di          ;Get start of line & chars/line
  177.      add  di,160         ;Next line, same column
  178.      dec  dl             ;Done all lines?
  179.      jne  C1             ;No
  180.      mov  Hlpflg,0       ;Yes, clear flag
  181.      call Vidon          ;Enable video
  182.      call Showcur        ;Turn cursor back on
  183.      jmp  Exit           ;and return
  184.  
  185. ; Sub to turn cursor off; come with ds=video.
  186. Hidecur: push cx,ds
  187.      mov  ds,cs          ;ds=cs
  188.      mov  ah,3           ;Get current cursor data
  189.      mov  bh,Vpage       ;for current page
  190.      int  10h
  191.      mov  Cursor,cx      ;Save cursor type
  192.      mov  ch,20h         ;Set cursor off
  193.      mov  ah,1
  194.      int  10h
  195.      pop  ds,cx
  196.      ret
  197.  
  198. ; Sub to turn cursor on; come with ds=cs.
  199. Showcur: mov  cx,Cursor  ;Set original cursor Type
  200.      mov  bh,Vpage
  201.      mov  ah,1
  202.      int  10h
  203.      ret
  204.  
  205. ; Turn video off
  206. Vidoff: cs cmp  Mode,7   ;Mono?
  207.      je   D0             ;Yes, skip wait for vert retrace
  208.      push ds,dx,ax
  209.      call Getmode        ;Get current video mode byte
  210.      and  al,0F7         ;Clear video enable bit
  211.      out  dx,al          ;Send to mode control port
  212.      pop  ax,dx,ds
  213. D0:  ret
  214.  
  215. ; Turn video on
  216. Vidon: cs cmp  Mode,7    ;Mono?
  217.      je   E0             ;Yes, skip wait for vert retrace
  218.      push ds,dx,ax
  219.      call Getmode        ;Get current video mode byte
  220.      or   al,8           ;Set video enable bit
  221.      out  dx,al          ;Send to mode control port
  222.      pop  ax,dx,ds
  223. E0:  ret
  224.  
  225. ; Sub to wait for vertical retrace to avoid snow on CGA screen.
  226. Vert: mov dx,3DAh        ;CRT status port
  227. F1:  in   al,dx          ;Read status
  228.      test al,8           ;Vert retrace?
  229.      je   F1             ;No
  230.      mov  dx,3D8h        ;Point to video mode port
  231.      ret                 ;Yes, return
  232.  
  233. Getmode: call Vert       ;Wait for vert retrace
  234.      mov  ax,40h         ;Get video mode
  235.      mov  ds,ax          ;at 465h
  236.      mov  al,b[65h]
  237.      ret                 ;and return
  238.  
  239. ; Come here to install the program as the new Int 9 routine.
  240. Init: mov ax,3509h       ;Get current Int 9 vector
  241.      int  21h            ;in es:bx
  242.      mov  ds,cs          ;this code
  243.      mov  w[Oldint+1],bx ;Save it
  244.      mov  w[Oldint+3],es
  245.      mov  ax,2509h       ;Set new Int 9 routine
  246.      mov  dx,Start
  247.      int  21h
  248.      mov  dx,Init        ;Terminate and
  249.      int  27h            ;stay resident
  250.